package cn.maidouya.basic.service.impl;

import cn.maidouya.basic.constants.UserConstants;
import cn.maidouya.basic.exception.BusinessExcepiton;
import cn.maidouya.basic.service.IVerifycodeService;
import cn.maidouya.basic.util.SmsUtil;
import cn.maidouya.basic.util.StrUtils;
import cn.maidouya.user.domain.User;
import cn.maidouya.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    @Override
    public void loadById(Map<String, String> params) {
        // 获取注册手机号码
        String phone = params.get("phone");
        // 获取注册页面信息(比如：register和binder，这是前端提供页面信息)
        String type = params.get("type");
        // 判断手机号码是空 抛异常   StringUtils.hasLength(phone)判断字符串是空  但是这里采用取反判断
        if (!StringUtils.hasLength(phone)){
            throw new BusinessExcepiton("输入手机号码！！");
        }
        // 判断是哪个页面进来获取验证码
        if ("register".equals(type)){
            // 手机号码获取验证码   需要判断手机号码是否已经注册
                    User user = userMapper.loadByPhone(phone);
                    if (user != null){
                        throw new BusinessExcepiton("用户已存在，请登录！");
                    }
            // 发送短信 手机号码注册user_register_code_prefix:18886530569
            String businessKey = UserConstants.USER_REGISTER_CODE_PREFIX+phone;
            sendSMSCode(businessKey);
        } else if("binder".equals(type)){
            // 微信绑定用户获取验证码   已经对用户注册手机号码判断过    未绑定  新用户直接发短信
            String businessKey = UserConstants.BINDER_CODE_PREFIX+phone;
            sendSMSCode(businessKey);
        }
        /**
         *   统一发短信接口
         */
    }
    public void sendSMSCode(String businessKey){//user_register_code_prefix:13659712468
        // 上过上面判断   接下来都是新手机号码注册   获取Redis中验证码
        Object phoneObj = redisTemplate.opsForValue().get(businessKey);//KQ6B:1617548893767
        String code = null;
        if (phoneObj != null) {// 判断phoneObj存在时间戳不为空时
            String codeObj = (String) phoneObj;//KQ6B:1617548893767
            Long time = Long.valueOf(codeObj.split(":")[1]);// 分离出来是发送验证码时间
            long interval = System.currentTimeMillis() - time;//1617548893767
            if (interval <=1*60*1000){//验证码还没到1分钟的时间//164992
                throw new BusinessExcepiton("请勿重复发送验证码！！");
            }
            /* void set(K var1, V var2, long var3, TimeUnit var5); */
            code = codeObj.split(":")[0];//对时间戳分离作用  对1分钟后未到3分钟时效再次发送验证码
        }else {
            // 没有验证码或者验证码失效   这时候生成新的验证码 并且code赋值保存到Redis中
            code = StrUtils.getComplexRandomString(4);
        }
        // 对新的验证码存储到Redis中可以达到上面业务逻辑运算依据处理
        redisTemplate.opsForValue().set(businessKey,
                code+":"+System.currentTimeMillis(),
                3,
                TimeUnit.MINUTES);
        //
        String phone = businessKey.split(":")[1];
        // 调用发短信接口
        //SmsUtil.send(phone,code);
        System.out.println("您的验证码: " +phone+" : " + code + "  请在三分钟内使用！");
    }
}